package org.csu.softwaremetrics_demo.metric.ck;

/**
 * NOSI（Number of Static Invocations）度量类
 * 用于计算类中静态方法调用的数量
 * 继承自AST访问器，实现了Metric接口
 */

import org.csu.softwaremetrics_demo.entity.common.CKMetricSingleClass;
import org.csu.softwaremetrics_demo.entity.result.Result;
import org.csu.softwaremetrics_demo.metric.Metric;
import org.eclipse.jdt.core.dom.*;

public class NOSI extends ASTVisitor implements Metric<CKMetricSingleClass> {

    /**
     * 存储静态方法调用计数的字段
     */
    private int count = 0;

    /**
     * 访问方法调用节点
     * 检查是否调用了静态方法，如果是则增加计数
     *
     * @param node 方法调用节点
     * @return true 表示需要继续访问子节点
     */
    public boolean visit(MethodInvocation node) {
        IMethodBinding binding = node.resolveMethodBinding();
        if (binding != null && Modifier.isStatic(binding.getModifiers()))
            count++;

        return super.visit(node);
    }

    /**
     * 设置NOSI度量结果
     *
     * @param singleMetric 要设置结果的度量对象
     */
    @Override
    public void setSingleMetric(CKMetricSingleClass singleMetric) {
        singleMetric.setNosi(count);
    }

    /**
     * 执行NOSI度量计算
     *
     * @param cu           编译单元
     * @param singleMetric 存储度量结果的对象
     * @param result       包含所有度量结果的报告
     */
    @Override
    public void execute(CompilationUnit cu, CKMetricSingleClass singleMetric, Result result) {
        cu.accept(this);
    }

}
